#include <cstdio>
#include <cstdlib>
#include <stdexcept>
#include <utility>
#include <vector>

#include "XMatrix.hpp"

void test_flow(XMatrix &hostA, XMatrix &hostB) {
  // 展示一下
  printf("Matrix A:\n");
  hostA.print();
  printf("Matrix B:\n");
  hostB.print();

  // 相乘
  auto hostC = hostA * hostB;

  // 展示结果
  printf("Result of A * B:\n");
  hostC.print();
}

void test_case1() {
  printf("Test Case 1:\n");
  // 测试用例1：矩阵A为4x4从0到15的矩阵，矩阵B为4x1从0到3的矩阵
  XMatrix hostA(4, 4); // 4行4列
  XMatrix hostB(4, 1); // 4行1列
  hostA.fill_range();  // A矩阵填充0-15
  hostB.fill_range();  // A矩阵填充0-3

  test_flow(hostA, hostB);
}

void test_case2() {
  printf("Test Case 2:\n");
  // 测试用例2：矩阵A为4x4全1矩阵，矩阵B为4x1全1矩阵
  XMatrix hostA(4, 4); // 4行4列
  XMatrix hostB(4, 1); // 4行1列
  hostA.fill_one();    // A矩阵填充1
  hostB.fill_one();    // A矩阵填充1
  test_flow(hostA, hostB);
}

void test_case3() {
  printf("Test Case 2:\n");
  // 测试用例2：矩阵A为4x4全1矩阵，矩阵B为4x1全1矩阵
  XMatrix hostA(2, 2); // 4行4列
  XMatrix hostB(2, 1); // 4行1列
  std::vector<float> tmp{1.0f, 2.0f, 3.0f, 4.0f};
  hostA.fill_array(tmp.data()); // A矩阵填充1,2,3,4
  hostB.fill_one();             // B矩阵填充1,1
  test_flow(hostA, hostB);
}

int main() {
  test_case1();
  test_case2();
  test_case3();
  // 其他测试用例可以在这里添加
  // ...
  return 0;
}
